Swift 是一種強行別語言,意思是 Swift 的編譯器必須明確的知道我們程式碼中所使用的形態。
不過,相對來說也損失了一些彈性,假設我們現在想要寫一個叫做「Flower」的類別,要寫一堆程式碼處理字串、另外一堆程式碼處理日期、另外一堆處理整數...,實在很煩人。
所以,我們這時候就要使用**泛型(generic)**了,他讓我們寫程式時不用精確的指定要處理的資訊是什麼。拿 Array 打個比方:Array 不關心它儲存的東西是什麼形態,只關心要把東西照順序放好,陣列(Array)就是一個泛型。
要建立一個泛型的型別,我們一樣將我們的類別取好名字後,在類別名稱後面加上 < >,裡面寫一種形態,通常裡面那個形態會寫「T」不過其實可以放入任何想放入的文字:若想要建立一個 Flower 泛型物件,內容包括一個值與任意個子 Flower 物件,可以這樣寫:
class Flower<F> {
//在類別內,現在 " F " 會被當成一種類型
//" value "是 F 形態的變數
var value: F
//" children "是一個裝載 Flower 物件的陣列
//該陣列的形態和本物件是相同的
private (set) var children: [Flower<F>] = []
//我們支援用 F 形態的一個值初始化這個物件
init(value: F){
self.value = value
}
//也可以加入一個子節點到我們的子3清單中
func addChild(value: F) -> Flower<F> {
let newChild = Flower<F>(value: value)
children.append(newChild)
return newChild
}
}
建立好泛型之後,我們就可以搭配不同形態使用了。舉例來說,剛剛建立的 Flower 泛型,就可以建立一個指定接受 Int 變數,再建立另一個指定接受 String 變數:
//Flower搭配整數使用
let integerFlower = Flower<Int>(value: 5)
//可加入內含整數的字項
integerFlower.addChild(value: 10)
integerFlower.addChild(value: 5)
//搭配字串使用
let stringFlower = Flower<String>(value: "Hello")
stringFlower.addChild(value: "Yes")
stringFlower.addChild(value: "Internets")